package javaCode.chapter16.threaduse;

/**
 * @author 徐州城
 * @version 1.0
 * 通过实现接口Runnable 来开发线程
 *
 * 请编写程序，该程序可以每隔1秒。在控制台输出 "hi"，当输出10次后，自动退出。
 * 请使用实现Runnable接口的方式实现。这里使用了设计模式[代理模式]
 */
public class Thread02 {
    public static void main(String[] args) {

        Dog dog = new Dog();
        //dog.start; 这里不能调用start
        //创建了Thread对象，把 dog对象(实现Runnable)，放入Thread
        Thread thread = new Thread(dog);
        thread.start();

//        Tiger tiger = new Tiger();//实现了Runnable
//        ThreadProxy proxy = new ThreadProxy(tiger);
//        proxy.start();

    }
}

class Animal{}
class Tiger extends Animal implements Runnable{

    @Override
    public void run() {
        System.out.println("老虎嗷嗷叫~");
    }
}

//线程代理，模拟了一个极简的Thread类
class ThreadProxy implements Runnable{//你可以把Proxy类当作 Thread

    private Runnable target = null;//属性，类型是 Runnable

    @Override
    public void run() {
        if (target != null){
            target.run();//动态绑定 （运行类型 Tiger）
        }
    }

    public ThreadProxy(Runnable target) {
        this.target = target;
    }

    public void start(){
        start0();//这个方法是真正实现多线程的方法
    }

    public void start0(){
        run();
    }
}


class Dog implements Runnable{//通过Runnable接口，开发线程

    @Override
    public void run() {//普通方法

        int count = 0;
        while (true){
            System.out.println("小狗汪汪叫~~ " + (++count) + "  " + Thread.currentThread().getName());

            //休眠1秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (count == 10)
                break;
        }
    }
}
